<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>Document</title>
  </head>
  <body>
    <script>
      /*  理解new运算的过程 */
      // 0.创建函数构造器
      function Person(name) {
        this.name = name
      }
      Person.prototype.getName = function () {
        return this.name
      }

      // 2.创建一个new对象工厂
      var objectFactory = function (Con, ...args) {
        // 2.1 从Object.prototype上克隆一个空的对象
        var obj = new Object()
        // 2.2 取得外部传入的构造器
        Constructor = [].shift.call(arguments)
        // 2.3 修改obj的对象原型(关键！！！！！)
        obj.__proto__ = Constructor.prototype
        // 2.4 给obj设置属性（关键！！！！！）
        var ret = Constructor.apply(obj, arguments)
        // 2.5 确保返回的是一个对象
        return typeof ret === 'Object' ? ret : obj
      }

      var a = objectFactory(Person, 'wangxin')
      console.log(a)
      console.log(a.name)
      console.log(a.getName())
      console.log(Object.getPrototypeOf(a) === Person.prototype)
    </script>
  </body>
</html>
